package org.lanyu.springainovel.novel.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.lanyu.springainovel.novel.entity.ChapterContent;
import org.lanyu.springainovel.novel.dto.ChapterOutlineGenerationRequest;
import org.lanyu.springainovel.novel.dto.ChapterOutlineGenerationResponse;
import org.lanyu.springainovel.novel.dto.ChapterContentGenerationRequest;
import com.baomidou.mybatisplus.extension.service.IService;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 章节正文服务接口
 */
public interface ChapterContentService extends IService<ChapterContent> {
    
    /**
     * 根据书籍ID获取所有章节
     * 
     * @param bookId 书籍ID
     * @return 章节列表
     */
    List<ChapterContent> getChaptersByBookId(Long bookId);
    
    /**
     * 根据书籍ID和章节号获取章节
     * 
     * @param bookId 书籍ID
     * @param chapterNumber 章节号
     * @return 章节内容
     */
    ChapterContent getChapterByBookIdAndNumber(Long bookId, Integer chapterNumber);
    
    /**
     * 创建或更新章节
     * 
     * @param chapter 章节信息
     * @return 创建或更新后的章节
     */
    ChapterContent saveOrUpdateChapter(ChapterContent chapter);
    
    /**
     * 根据ID获取章节
     * 
     * @param id 章节ID
     * @return 章节信息
     */
    ChapterContent getChapterById(Long id);
    
    /**
     * 根据书籍ID分页查询章节细纲
     * 
     * @param bookId 书籍ID
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 分页结果，包含章节细纲列表
     */
    Page<ChapterContent> getChapterOutlinesByBookId(Long bookId, Integer pageNum, Integer pageSize);
    
    /**
     * 生成章节细纲
     * 
     * @param request 生成章节细纲请求
     * @param userId 用户ID
     * @return 生成章节细纲响应
     */
    ChapterOutlineGenerationResponse generateChapterOutlines(ChapterOutlineGenerationRequest request, Long userId);
    
    /**
     * 生成章节正文流式响应
     * 
     * @param request 生成章节正文请求
     * @param userId 用户ID
     * @return 流式响应
     */
    Flux<String> generateChapterContentStream(ChapterContentGenerationRequest request, Long userId);
    
    /**
     * 生成章节正文
     * 
     * @param request 生成章节正文请求
     * @param userId 用户ID
     * @return 章节内容
     */
    ChapterContent generateChapterContent(ChapterContentGenerationRequest request, Long userId);
}